package com.lovo.pz.util;

import java.awt.Component;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**
 * 游戏图片的封装类，可以加载图片
 */

public class GameImage {
	public static final int HORIZONTAL = 0;
	public static final int VERTICAL = 1;
	/**
	 * 加载图片，同时进行媒体跟踪
	 * @param tracker 媒体跟踪器
	 * @param imgPath 要加载的图片路径
	 * @return 已加载的图片对象
	 */
	public static Image loadImage(MediaTracker tracker,String imgPath){
		ImageIcon img = new ImageIcon(imgPath);
		//得到Image对象
		Image image = img.getImage();
		//将图片加载到媒体追踪器中
		tracker.addImage(image, 0);
		waitForLoad(tracker);
		return image;
	}
	/**
	 * 加载图片，同时进行媒体跟踪
	 * @param tracker 媒体跟踪器
	 * @param imgPath 要加载的图片路径
	 * @return 已加载的图片对象
	 */
	public static Image loadImage(MediaTracker tracker,String imgPath,int w,int h){
		ImageIcon img = new ImageIcon(imgPath);
		//得到Image对象
		Image image = img.getImage();
		//将图片加载到媒体追踪器中
		tracker.addImage(image, 0,w,h);
		waitForLoad(tracker);
		return image;
	}


	/**
	 * 加载图片数组，同时进行媒体跟踪
	 * @param tracker 媒体跟踪器
	 * @param imgPathes 要加载的图片路径数组
	 * @return 已加载的图片对象数组
	 */
	public static Image [] loadImage(MediaTracker tracker,String [] imgPathes){
		Image [] imgs = new Image[imgPathes.length];
		for(int i = 0;i < imgPathes.length;i++){
			ImageIcon icon = new ImageIcon(imgPathes[i]);
			imgs[i] = icon.getImage();
			tracker.addImage(imgs[i], 0);
		}
		waitForLoad(tracker);
		return imgs;
	}

	/**
	 * 加载图片数组，同时进行媒体跟踪
	 * @param tracker 媒体跟踪器
	 * @param images 要加载的图片数组
	 * @return 已加载的图片对象数组
	 */
	public static Image [] loadImage(MediaTracker tracker,Image [] images){
		for(int i = 0;i < images.length;i++){
			tracker.addImage(images[i], 0);
		}
		waitForLoad(tracker);
		return images;
	}


	/**
	 * 加载图片二维数组，同时进行媒体跟踪
	 * @param tracker 媒体跟踪器
	 * @param images 要加载的图片二维数组
	 * @return 已加载的图片对象数组
	 */
	public static Image [][] loadImage(MediaTracker tracker,Image [][] images){
		for(int i = 0;i < images.length;i++){
			for (int j = 0; j < images[i].length; j++) {

				tracker.addImage(images[i][j], 0);
			}
		}
		waitForLoad(tracker);
		return images;
	}
	/**
	 * 重新加载动态效果图片
	 * @param img
	 * @return
	 */
	public static Image loadImage(Image img){
		return Toolkit.getDefaultToolkit().createImage(img.getSource());
	}

	/**
	 * 分割图片成一维数组
	 * @param tracker 媒体追踪器
	 * @param component 面板对象
	 * @param cuteType 切割方向，水平或垂直两个方向
	 * @param imgPathes 要分割的图片路径
	 * @param length 一维数组的长度
	 * @param x 分割的图片宽
	 * @param y 分割的图片高
	 * @return 分割完成以后的一维数组
	 */
	public static Image [] cutImage(MediaTracker tracker,Component component,int cutType,String imgPathes,int length,int x,int y){
		ImageIcon icon = new ImageIcon(imgPathes);
		Image img = icon.getImage();
		Image [] imges = new Image[length];
		//获得图片资源对象
		ImageProducer producer = img.getSource();
		for(int i = 0;i < imges.length;i++){
			CropImageFilter crop = null;
			if(cutType == HORIZONTAL){
				crop = new CropImageFilter(x*i,0,x,y);

			}else{
				crop = new CropImageFilter(0,y*i,x,y);
			}
			FilteredImageSource src = new FilteredImageSource(producer,crop);
			imges[i] = component.createImage(src);
		}
		//将图片数组加入媒体追踪
		loadImage(tracker,imges);
		return imges;
	}

	/**
	 * 分割图片成二维数组
	 * @param tracker 媒体追踪器
	 * @param component 面板对象
	 * @param imgPathes 要分割的图片路径
	 * @param length1 一维数组的长度
	 * @param length2 二维数组的长度
	 * @param x 分割的图片宽
	 * @param y 分割的图片高
	 * @return 分割完成以后的一维数组
	 */
	public static Image [][] cutImage(MediaTracker tracker,Component component,String imgPathes,int length1,int length2,int x,int y){
		ImageIcon icon = new ImageIcon(imgPathes);
		Image img = icon.getImage();
		Image [][] imges = new Image[length1][length2];
		//获得图片资源对象
		ImageProducer producer = img.getSource();
		for(int i = 0;i < imges.length;i++){
			for(int j = 0;j < imges[i].length;j++){
				CropImageFilter crop = new CropImageFilter(x*j,y*i,x,y);
				FilteredImageSource src = new FilteredImageSource(producer,crop);
				imges[i][j] = component.createImage(src);

			}
		}
		//将图片数组加入媒体追踪
		loadImage(tracker,imges);
		return imges;
	}


	/**
	 * 等待加载图片
	 * @param tracker
	 */
	public static void waitForLoad(MediaTracker tracker){
		try {
			//加载图片
			tracker.waitForID(0);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if((tracker.statusAll(false) & MediaTracker.ERRORED) != 0){
			JOptionPane.showMessageDialog(null, "图片加载失败！");
			System.exit(0);
		}

	}


}
